/************************************************************************************************
*Definicion de Tabla de simbolos                                                                *
*Author     :   Simon Emmanuel Gutierrez Brida                                                  *
*Version    :   0.1                                                                             *
*Fecha      :   Septiembre/2011                                                                 *
*-------------------------------                                                                *
*Define la estructura y funciones asociadas para una tabla de simbolos                          *
*La estructura sobre la cual se basa la tabla de simbolos sera la de lista de listas pero se    *
*va a definir un tipo TablaSimbolos para permitir cambiar la estructura base pero permitiendo   *
*que se siga utilizando las mismas funciones y tipos                                            *
*************************************************************************************************/

#ifndef TABLASIMBOLOS_H
#define TABLASIMBOLOS_H

#include "../lista/listalistas.h"
#include "../variable.h"
#include <stdbool.h>

typedef struct {
    ListaListas *tablaSimbolos;
    int nivelActual;
} TablaSimbolos;

/*funciones publicas para manipular tabla de simbolos*/

/*Constructores*/

/**
 * Construye una nueva tabla de simbolos vacia
 */
TablaSimbolos* nuevaTabla();

/*lectura de informacion*/

/**
 * Obtiene una variable segun su identificador en un nivel particular de la tabla
 * parametros
 * tabla: la tabla en la cual buscar
 * nivel: el nivel de la tabla en la cual buscar
 * id: el identificador de la variable buscada
 * ---
 * En caso de que no existe ninguna variable con el id buscado en el nivel buscado se retornara NULL
 */
Variable* obtenerVariable(TablaSimbolos *tabla, int nivel, char *id);

/**
 * Obtiene una variable segun su identificador partiendo desde el nivel actual al nivel 0
 * parametros
 * tabla: la tabla en la cual buscar
 * id: el identificador de la variable buscada
 * ---
 * - Si la variable no se encuentra en el nivel actua, entonces se busca en el nivel anterior
 * - Si la variable no es encontrada en ningun nivel entonces se retornara NULL
 */
Variable* obtenerMasCercana(TablaSimbolos *tabla, char *id);

/**
 * Consulta la existencia de una variable segun un identificador en la tabla de simbolos
 * parametros
 * tabla: la tabla sobre la cual buscar
 * id: el identificador de la variable buscada
 * ---
 * La busqueda comienza en el nivel actual y sigue hasta llegar al nivel 0
 */
bool existe(TablaSimbolos *tabla, char *id);

/**
 * Consulta la existencia de una variable segun un identificador en el nivel actual de la tabla
 * parametros
 * tabla: la tabla en la cual buscar
 * id: el identificador de la variable buscada
 */
bool existeEnNivelActual(TablaSimbolos *tabla, char *id);

/**
 * Consulta la existencia de una variable segun un identificador en un nivel particular de la tabla
 * parametros
 * tabla: la tabla en la cual buscar
 * nivel: el nivel sobre el cual buscar
 * id: el identificador de la variable buscada
 */
bool existeEnNivel(TablaSimbolos *tabla, int nivel, char *id);

/**
 * Retorna el nivel actual en la tabla
 * parametros
 * tabla: la tabla sobre la cual consultar
 */
int nivelActual(TablaSimbolos *tabla);

/*escritura de informacion*/

/**
 * Abre un nuevo nivel en la tabla de simbolos
 * parametros
 * tabla: la tabla sobre la cual abrir un nuevo nivel
 */
void abrirNivel(TablaSimbolos *tabla);

/**
 * cierra el nivel actual en la tabla
 * parametros
 * tabla: la tabla sobre la cual cerrar el nivel actual
 */
void cerrarNivel(TablaSimbolos *tabla);

/**
 * Inserta una nueva variable en el nivel actual de la tabla de simbolos
 * parametros
 * tabla: la tabla en la cual se insertara la nueva variable
 * var: la variable a insertar
 */
bool insertarVariable(TablaSimbolos *tabla, Variable *var); /*inserta en el nivel actual*/
                                                             
/**
 * Elimina una variable del nivel actual de la tabla de simbolos segun su identificador
 * parametros
 * tabla: la tabla de la cual eliminar la variable
 * id: el identificador de la variable a eliminar
 * ---
 * si la variable a eliminar existe en el nivel actual, entonces se retorna Verdadero sino Falso
 */
bool eliminarVariable_id(TablaSimbolos *tabla, char *id); /*elimina la variable dado su ID en el nivel actual*/
                                                           
                                                           /**
 * Elimina una variable del nivel actual de la tabla de simbolos
 * parametros
 * tabla: la tabla de la cual eliminar la variable
 * var la variable a eliminar
 * ---
 * si la variable a eliminar existe en el nivel actual, entonces se retorna Verdadero sino Falso
 */
bool eliminarVariable_var(TablaSimbolos *tabla, Variable *var); /*elimina la variable en el nivel actual*/

#endif